<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../node_modules/vue/dist/vue.global.js"></script>
</head>

<body>
    <div id="app">
        <p>count:{{count}}</p>
        <p>{{msg}}</p>
        <button @click="addCount">add+1</button>
    </div>
</body>

</html>

<script>
    // 知识点1: 绑定 #app 标签都是根标签 ,可以使用其他选择器.
    // 知识点2: vue 实现数据渲染,怎么实现数据渲染?


    // 实现数据渲染: 
    // 第一步: vue 会将当前的页面生成一个虚拟dom 节点,虚拟dom 就是一个js 对象(用来,描述dom 结构的对象)
    // 第一次的虚拟dom 
    let vnode1 = {
        tag: div,
        attrs: {
            id: 'app'
        },
        children: [
            {
                tag: "p",
                attrs: null,
                children: ['count:{{count}}']
            },
            {
                tag: "p",
                attrs: null,
                children: ['{{ msg }}']
            }, {
                tag: 'button',
                attrs: {
                    '@click': 'addCount'
                },
                children: ['add+1']
            }
        ]
    }

    // 第二次虚拟dom
    let vnode2 = {
        tag: div,
        attrs: {
            id: 'app'
        },
        children: [
            {
                tag: "p",
                attrs: null,
                children: ['count:0']
            },
            {
                tag: "p",
                attrs: null,
                children: ['今天天不错']
            }, {
                tag: 'button',
                attrs: {
                    '@click': 'addCount'
                },
                children: ['add+1']
            }
        ]
    }

    // 第二步: 使用第一次的虚拟dom 和第二次的虚拟dom 做比较,如果有变化得内容, 直接修改变化的内容,然后渲染页面

    // 第三次:当数据发生修改时,count 变成++; 

    let vnode3 = {
        tag: div,
        attrs: {
            id: 'app'
        },
        children: [
            {
                tag: "p",
                attrs: null,
                children: ['count:1']
            },
            {
                tag: "p",
                attrs: null,
                children: ['今天天不错']
            }, {
                tag: 'button',
                attrs: {
                    '@click': 'addCount'
                },
                children: ['add+1']
            }
        ]
    }

    // 第三次: 将数据更新后的虚拟dom 和 上次的虚拟dom 做比较,如果有数据发生变化, 那么就局部更新变化了的dom, 
    // 页面中只更新count 这个标签节点
    // 第二次虚拟dom 和第三次的虚拟dom 做比较,然后布局更新真实dom(真实dom 就是页面的标签结构);
    // 所以 vue 的渲染效率极大的提高了浏览器的性能

    // 特点: 首次渲染效率没有提升,只是后期数据更新后的渲染效率提升
    // 流程: => 生成 虚拟dom => 虚拟dom 转成真实dom=> 渲染页面=> 数据发生变化,又生成新的虚拟dom=>
    // => 新旧虚拟dom 比较(diff 算法)=> 局部更新真实dom
    const app = Vue.createApp({
        data() {
            return {
                count: 0,
                msg: "今天天不错"
            }
        },
        methods: {
            addCount() {
                this.count++
            }
        }
    }).mount('#app')

</script>